home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Best of MacTutor - S…e Code for Volumes 1 to 5
/
The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin
/
Source Code
/
#49 (Oct 89)
/
After Dark Source
/
BH Module.p
next >
Wrap
Text File
|
1989-08-12
|
6KB
|
211 lines
{Black Hole Module Module.p}
{A very simple graphics module for After Dark™}
{ Generic Shell by Patrick Beard and Bruce Burkhalter }
{ © 1989 Berkeley Systems Inc . }
{ module by Dave Kelly, © 1989 MacTutor}
unit BlackHole;
interface
uses
Quickdraw, GraphicsModuleTypes;
function DoInitialize (var storage: Handle; blankRgn: rgnHandle; params: GMParamBlockPtr): OSErr;
function DoBlank (storage: Handle; blankRgn: rgnHandle; params: GMParamBlockPtr): OSErr;
function DoDrawFrame (storage: Handle; blankRgn: rgnHandle; params: GMParamBlockPtr): OSErr;
function DoClose (storage: Handle; blankRgn: RgnHandle; params: GMParamBlockPtr): OSErr;
function DoSetup (blankRgn: rgnHandle; message: integer; params: GMParamBlockPtr): OSErr;
implementation
type
BHStorage = record
CircleRect: Rect; {this is the rectangle for the circle to be drawn}
CircleColor: integer;
BlankingColor: integer;
Center: Point;
Origin: Point;
ScreenRect: Rect;
end;
BHStoragePtr = ^BHStorage;
BHStorageHandle = ^BHStoragePtr;
function DoInitialize (var storage: Handle; blankRgn: rgnHandle; params: GMParamBlockPtr): OSErr;
{Allocate memory and initialize variables here}
var
result: OSErr;
myStorage: BHStorageHandle;
begin
{ allocate handle to my storage }
myStorage := BHStorageHandle(NewHandle(sizeof(BHStorage)));
if MemError <> noErr then
begin
DoInitialize := MemError;
exit(DoInitialize);
end;
MoveHHi(Handle(myStorage));
HLock(Handle(myStorage)); { Lock it down. }
myStorage^^.circlecolor := blackcolor;
myStorage^^.blankingcolor := blackcolor;
storage := Handle(myStorage);{ assign myStorage to passed handle }
myStorage^^.screenrect := params^.qdGlobalsCopy^.qdScreenBits.bounds;
myStorage^^.Center.h := params^.qdGlobalsCopy^.qdScreenBits.bounds.right div 2;
myStorage^^.Center.v := params^.qdGlobalsCopy^.qdScreenBits.bounds.bottom div 2;
myStorage^^.origin.h := 0;
myStorage^^.origin.v := 0;
myStorage^^.CircleRect := params^.qdGlobalsCopy^.qdScreenBits.bounds;
InsetRect(myStorage^^.CircleRect, myStorage^^.Center.h, myStorage^^.Center.v);
HUnlock(Handle(myStorage));
DoInitialize := noErr;
end;
function DoBlank (storage: Handle; blankRgn: rgnHandle; params: GMParamBlockPtr): OSErr;
begin
{Blank the screen. You could also have "credits" appear on the screen here}
FillRgn(blankRgn, params^.qdGlobalsCopy^.qdBlack);
params^.brightness := params^.controlValues[1] * 255 div 100;
DoBlank := noErr;
end;
function DoDrawFrame (storage: Handle; blankRgn: rgnHandle; params: GMParamBlockPtr): OSErr;
var
result: OSErr;
myStorage: BHStoragePtr;{ to hold dereferenced storage handle }
dh, dv: integer; {horiz and vert change parameters}
begin
{This function is repeatedly called by After Dark™. This is where the main drawing is done.}
{lock our storage down so we can deference it once for faster access}
MoveHHi(storage);
HLock(storage);
myStorage := BHStoragePtr(storage^);
dv := -1;
dh := -1;
InsetRect(myStorage^.CircleRect, dh, dv);
if PtInRect(myStorage^.Origin, myStorage^.CircleRect) then
begin
myStorage^.CircleRect := params^.qdGlobalsCopy^.qdScreenBits.bounds;
InsetRect(myStorage^.CircleRect, myStorage^.Center.h, myStorage^.Center.v);
forecolor(myStorage^.Blankingcolor);
FillRgn(blankRgn, params^.qdGlobalsCopy^.qdBlack);
if params^.controlValues[0] = 1 then
case myStorage^.blankingcolor of
blackcolor:
myStorage^.blankingcolor := whitecolor;
whitecolor:
myStorage^.blankingcolor := redcolor;
redcolor:
myStorage^.blankingcolor := greencolor;
greencolor:
myStorage^.blankingcolor := bluecolor;
bluecolor:
myStorage^.blankingcolor := cyancolor;
cyancolor:
myStorage^.blankingcolor := magentacolor;
magentacolor:
myStorage^.blankingcolor := yellowcolor;
yellowcolor:
myStorage^.blankingcolor := blackcolor;
otherwise
myStorage^.blankingcolor := blackcolor;
end
else
case myStorage^.blankingcolor of
blackcolor:
myStorage^.blankingcolor := whitecolor;
whitecolor:
myStorage^.blankingcolor := blackcolor;
otherwise
myStorage^.blankingcolor := blackcolor;
end;
end;
if params^.controlValues[0] = 1 then
case myStorage^.circlecolor of
blackcolor:
myStorage^.circlecolor := whitecolor;
whitecolor:
myStorage^.circlecolor := redcolor;
redcolor:
myStorage^.circlecolor := greencolor;
greencolor:
myStorage^.circlecolor := bluecolor;
bluecolor:
myStorage^.circlecolor := cyancolor;
cyancolor:
myStorage^.circlecolor := magentacolor;
magentacolor:
myStorage^.circlecolor := yellowcolor;
yellowcolor:
myStorage^.circlecolor := blackcolor;
otherwise
myStorage^.circlecolor := blackcolor;
end
else
case myStorage^.circlecolor of
blackcolor:
myStorage^.circlecolor := whitecolor;
whitecolor:
myStorage^.circlecolor := blackcolor;
otherwise
myStorage^.circlecolor := blackcolor;
end;
params^.brightness := params^.controlValues[1] * 255 div 100;
forecolor(myStorage^.circlecolor);
frameoval(myStorage^.CircleRect);
HUnlock(storage);
DoDrawFrame := noErr;
end;
function DoClose (storage: Handle; blankRgn: RgnHandle; params: GMParamBlockPtr): OSErr;
{Deallocate your memory here. You can also put something on the screen.}
var
myStorage: BHStorageHandle;
begin
{deallocate our storage}
myStorage := BHStorageHandle(storage);
if (myStorage <> nil) then
begin
MoveHHi(storage);
HLock(storage);
if (params^.colorQDAvail = true) then
begin
end;
DisposHandle(storage);
end;
{check for memory errors}
DoClose := noErr;
end;
function DoSetup (blankRgn: rgnHandle; message: integer; params: GMParamBlockPtr): OSErr;
begin
{This is called when the used clicks on a button in the Control Panel.}
DoSetup := noErr;
end;
end.